package com.smart.community.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.user.dto.AddPropertyCompanyUserDTO;
import com.smart.community.user.dto.LoginDTO;
import com.smart.community.user.dto.UserDTO;
import com.smart.community.user.dto.UserQueryDTO;
import com.smart.community.user.dto.AvatarUploadDTO;
import com.smart.community.user.dto.AvatarUploadResponseDTO;
import com.smart.community.user.dto.UserProfileUpdateDTO;
import com.smart.community.user.dto.UserByRoleGroupDTO;
import com.smart.community.user.entity.User;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;
import com.smart.community.feign.user.dto.NormalUserCreateDTO;

/**
 * 用户Service接口
 * 
 * @author Wu.Liang
 */
public interface UserService extends IService<User> {

    /**
     * 用户登录
     * 
     * @param loginDTO 登录信息
     * @return 登录结果
     * @throws Exception 统一异常
     */
    Map<String, Object> login(LoginDTO loginDTO) throws Exception;

    /**
     * 用户登出
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void logout(Long userId) throws Exception;

    /**
     * 分页查询用户列表
     * 
     * @param queryDTO 查询条件
     * @return 用户列表
     * @throws Exception 统一异常
     */
    IPage<User> getUserPage(UserQueryDTO queryDTO) throws Exception;

    /**
     * 创建用户
     * 
     * @param userDTO 用户信息
     * @throws Exception 统一异常
     */
    void createUser(UserDTO userDTO) throws Exception;

    /**
     * 更新用户
     * 
     * @param userDTO 用户信息
     * @throws Exception 统一异常
     */
    void updateUser(UserDTO userDTO) throws Exception;

    /**
     * 更新用户个人资料
     * 
     * @param userId 用户ID
     * @param updateDTO 更新信息
     * @return 更新后的用户信息
     * @throws Exception 统一异常
     */
    com.smart.community.user.vo.UserVO updateUserProfile(Long userId, UserProfileUpdateDTO updateDTO) throws Exception;

    /**
     * 删除用户
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void deleteUser(Long userId) throws Exception;

    /**
     * 批量删除用户
     * 
     * @param userIds 用户ID列表
     * @throws Exception 统一异常
     */
    void batchDeleteUsers(List<Long> userIds) throws Exception;

    /**
     * 重置密码
     * 
     * @param userId 用户ID
     * @param newPassword 新密码
     * @throws Exception 统一异常
     */
    void resetPassword(Long userId, String newPassword) throws Exception;

    /**
     * 修改密码
     * 
     * @param userId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @throws Exception 统一异常
     */
    void changePassword(Long userId, String oldPassword, String newPassword) throws Exception;

    /**
     * 上传用户头像
     * 
     * @param userId 用户ID
     * @param file 头像文件
     * @param uploadDTO 上传参数
     * @return 头像上传响应信息
     * @throws Exception 统一异常
     */
    AvatarUploadResponseDTO uploadAvatar(Long userId, MultipartFile file, AvatarUploadDTO uploadDTO) throws Exception;

    /**
     * 启用用户
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void enableUser(Long userId) throws Exception;

    /**
     * 禁用用户
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void disableUser(Long userId) throws Exception;

    /**
     * 锁定用户
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void lockUser(Long userId) throws Exception;

    /**
     * 解锁用户
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void unlockUser(Long userId) throws Exception;

    /**
     * 分配角色
     * 
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @throws Exception 统一异常
     */
    void assignRoles(Long userId, List<Long> roleIds) throws Exception;

    /**
     * 获取用户角色列表
     * 
     * @param userId 用户ID
     * @return 角色列表
     * @throws Exception 统一异常
     */
    List<Map<String, Object>> getUserRoles(Long userId) throws Exception;

    /**
     * 获取用户菜单列表
     * 
     * @param userId 用户ID
     * @return 菜单列表
     * @throws Exception 统一异常
     */
    List<Map<String, Object>> getUserMenus(Long userId) throws Exception;

    /**
     * 检查用户名是否存在
     * 
     * @param username 用户名
     * @return 是否存在
     * @throws Exception 统一异常
     */
    boolean checkUsernameExists(String username) throws Exception;

    /**
     * 检查手机号是否存在
     * 
     * @param phone 手机号
     * @return 是否存在
     * @throws Exception 统一异常
     */
    boolean checkPhoneExists(String phone) throws Exception;

    /**
     * 检查邮箱是否存在
     * 
     * @param email 邮箱
     * @return 是否存在
     * @throws Exception 统一异常
     */
    boolean checkEmailExists(String email) throws Exception;

    /**
     * 根据数据权限查询用户列表
     * 
     * @param currentUserId 当前用户ID
     * @param queryDTO 查询条件
     * @return 用户列表
     * @throws Exception 统一异常
     */
    List<User> getUsersByDataPermission(Long currentUserId, UserQueryDTO queryDTO) throws Exception;

    /**
     * 检查用户名是否唯一
     * 
     * @param username 用户名
     * @param userId 用户ID（排除当前用户）
     * @return 是否唯一
     * @throws Exception 统一异常
     */
    boolean checkUsernameUnique(String username, Long userId) throws Exception;

    /**
     * 检查手机号是否唯一
     * 
     * @param phone 手机号
     * @param userId 用户ID（排除当前用户）
     * @return 是否唯一
     * @throws Exception 统一异常
     */
    boolean checkPhoneUnique(String phone, Long userId) throws Exception;

    /**
     * 检查邮箱是否唯一
     * 
     * @param email 邮箱
     * @param userId 用户ID（排除当前用户）
     * @return 是否唯一
     * @throws Exception 统一异常
     */
    boolean checkEmailUnique(String email, Long userId) throws Exception;

    /**
     * 检查身份证号是否唯一
     * 
     * @param idCard 身份证号
     * @param userId 用户ID（排除当前用户）
     * @return 是否唯一
     * @throws Exception 统一异常
     */
    boolean checkIdCardUnique(String idCard, Long userId) throws Exception;

    /**
     * 修改用户状态
     * 
     * @param userId 用户ID
     * @param status 状态
     * @throws Exception 统一异常
     */
    void updateUserStatus(Long userId, Integer status) throws Exception;

    /**
     * 获取用户角色分配信息
     * @param userId 用户ID
     * @return 用户角色分配信息
     * @throws Exception 统一异常
     */
    com.smart.community.user.vo.UserRoleAssignVO getUserRoleAssignInfo(Long userId) throws Exception;

    /**
     * 物业公司人员新增
     * 
     * @param userData 用户信息
     * @throws Exception 统一异常
     */
    void addPropertyCompanyUser(AddPropertyCompanyUserDTO addPropertyCompanyUserDTO) throws Exception;

    /**
     * 获取物业公司用户列表
     * 
     * @param propertyCompanyId 物业公司ID
     * @param current 当前页
     * @param size 页大小
     * @return 用户分页列表
     * @throws Exception 统一异常
     */
    com.smart.community.commons.result.PageResult<com.smart.community.user.vo.UserVO> getPropertyCompanyUsers(Long propertyCompanyId, Integer current, Integer size) throws Exception;

    /**
     * 启用物业公司用户
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void enablePropertyCompanyUser(Long userId) throws Exception;

    /**
     * 禁用物业公司用户
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void disablePropertyCompanyUser(Long userId) throws Exception;

    /**
     * 重置物业公司用户密码
     * 
     * @param userId 用户ID
     * @throws Exception 统一异常
     */
    void resetPropertyCompanyUserPassword(Long userId) throws Exception;

    /**
     * 根据身份证号查询用户
     * 
     * @param idCard 身份证号
     * @return 用户信息
     * @throws Exception 统一异常
     */
    User getUserByIdCard(String idCard) throws Exception;

    /**
     * 根据手机号查询用户
     * 
     * @param phone 手机号
     * @return 用户信息
     * @throws Exception 统一异常
     */
    User getUserByPhone(String phone) throws Exception;

    /**
     * 创建普通用户（用于住户管理）
     * 
     * @param userData 用户信息
     * @return 用户ID
     * @throws Exception 统一异常
     */
     Long createNormalUser(NormalUserCreateDTO dto) throws Exception;

    /**
     * 根据角色编码获取用户列表
     * 
     * @param roleCode 角色编码
     * @return 用户列表
     * @throws Exception 统一异常
     */
    List<User> getUsersByRoleCode(String roleCode) throws Exception;
    
    // ==================== 用户统计方法 ====================
    
    /**
     * 根据社区ID列表统计用户数量
     * 
     * @param communityIds 社区ID列表
     * @return 用户数量
     * @throws Exception 统一异常
     */
    Long countUsersByCommunityIds(List<Long> communityIds) throws Exception;
    
    /**
     * 根据物业公司ID列表统计用户数量
     * 
     * @param propertyCompanyIds 物业公司ID列表
     * @return 用户数量
     * @throws Exception 统一异常
     */
    Long countUsersByPropertyCompanyIds(List<Long> propertyCompanyIds) throws Exception;
    
    /**
     * 根据房户ID列表统计用户数量
     * 
     * @param householdIds 房户ID列表
     * @return 用户数量
     * @throws Exception 统一异常
     */
    Long countUsersByHouseholdIds(List<Long> householdIds) throws Exception;
    
    /**
     * 获取用户注册趋势数据（按月统计）
     * 
     * @param communityIds 社区ID列表
     * @param months 统计月份数，默认6个月
     * @return 每月用户注册数量列表
     * @throws Exception 统一异常
     */
    List<Integer> getUserRegistrationTrend(List<Long> communityIds, int months) throws Exception;
    
    /**
     * 获取所有用户总数（超级管理员使用）
     * 
     * @return 用户总数
     * @throws Exception 统一异常
     */
    Long getTotalUserCount() throws Exception;
    
    /**
     * 获取所有用户注册趋势数据（超级管理员使用）
     * 
     * @param months 统计月份数，默认6个月
     * @return 每月用户注册数量列表
     * @throws Exception 统一异常
     */
    List<Integer> getUserRegistrationTrendForAll(int months) throws Exception;
    
    /**
     * 根据物业公司ID获取按角色分组的用户列表
     * 用于批量排班等场景，支持按角色进行批量选择
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 按角色分组的用户列表
     * @throws Exception 统一异常
     */
    List<UserByRoleGroupDTO> getUsersByRoleGroup(Long propertyCompanyId) throws Exception;
} 